Greasemonkey 源码阅读 yawf
yawf 是一个 Greasemonkey 脚本,提供微博增强功能。在本文中,记录了我代码阅读过程中的心得体会。
免责声明:本文仅用于技术学习和研究目的,不鼓励或支持任何形式的滥用。如读者选择使用本文中的信息进行任何非法或不当行为,作者概不负责。
这个脚本非常庞大,完整代码有近 2w 行。是一个多文件工程,通过一个自制打包脚本,合并为最终的单文件脚本。
Util
工具类,功能:
- util
- functools
- once:L272,只执行一次
 
- urls
- blobToDataUrl:L300,将 Blob对象转为 Data URL
 
- priority:L318
- performance:L259,性能统计
- debug:L399,打印 debug 日志
- debug.setEnabled:L400,debug 日志开关
- language:L413,语言
- strings
- parseint:“万”或“亿”的字串转换为数字
- randKey:随机字符串
- confusableHanConvert:同形汉字替换
- normalizeConfusableHanNode
 
- css
- add:L538,添加 CSS
 
- inject:L696,注入函数
- inject.Callback:注入的回调
- keyboard
- i18n
- base62
- mid
- crc
- tarball:打包工具
- time
 
- functools
inject
代码实现:
// 执行传入函数,连同输入参数
util.inject = function (func, ...params) {
  // 首次执行时,先执行 init
  // init 是一个 立即执行函数表达式 (IIFE)
  const setupScript = firstCall 
	  ? `(${init}(${JSON.stringify([baseKey, replyKey])}));` 
	  : ''; firstCall = false;
  // 执行传入函数
  const executeScript = setupScript + `window[${JSON.stringify(baseKey)}](${func},${serialize(params)});`;
  // 创建一个 script 节点
  const script = document.createElement('script');
  script.textContent = executeScript;
  const target = document.head || document.body || document.documentElement;
  return new Promise(resolve => {
    // 注册一个回调,运行成功后删除节点
    script.addEventListener('load', () => {
      resolve();
      script.parentElement.removeChild(script);
    });
    // 立即添加,或者等一小会儿添加
    if (target) target.appendChild(script);
    else setTimeout(function injectScript() {
      const target = document.head || document.body || document.documentElement;
      if (!target) setTimeout(injectScript, 10);
      else target.appendChild(script);
    }, 10);
  });
};
util.inject.Callback = Callback;
网络资源
本文作者:Maeiee
版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!
喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!
